/*
moxl - Modular XML Library
Copyright (c) 2007, Malcolm Sparks

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package moxl.xpath.parser.states.fncall;

import moxl.tokenizer.Token;
import moxl.tokenizer.TokenStream;
import moxl.xpath.parser.XPathParser;
import moxl.xpath.parser.XPathParserException;
import moxl.xpath.parser.states.XPathParserState;
import moxl.xpath.parser.types.Expression;
import moxl.xpath.parser.types.FunctionCall;
import moxl.xpath.parser.types.NonTerminal;

public class XPathFunctionCallExpectingCommaOrCloseState extends XPathParserState
{
	private static XPathParserState instance = new XPathFunctionCallExpectingCommaOrCloseState();

	public static XPathParserState getInstance()
	{
		return instance;
	}

	@Override
    public void acceptComma(XPathParser ctx, TokenStream tstream, Token token, NonTerminal nonTerminal) throws XPathParserException
	{
		XPathParser parser = ctx.begetParser();
		Expression argExpr = parser.parseExpressionFromStream(tstream);
		FunctionCall fnCall = (FunctionCall) nonTerminal;
		if (argExpr.isPrimary())
		{
			fnCall.addArgument(argExpr.getFirstOperand());
		}
		else
		{
			fnCall.addArgument(argExpr);
		}
	}

	@Override
    public void acceptCloseParenthesis(XPathParser ctx, TokenStream tstream, Token token, NonTerminal nonTerminal) throws XPathParserException
	{
		ctx.changeState(XPathFunctionCallEndState.getInstance());
	}

}
